www.gusucode.com > 串口测试程序,用于调试rs485接口 串口通信的程序 > 串口测试程序,用于调试rs485接口 串口通信的程序/commtest/MeterGB.cpp
// MeterGB.cpp: implementation of the CMeterGB class. // ////////////////////////////////////////////////////////////////////// #include "MPGB.h" #include "MeterGB.h" #include "stdio.h" ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// CMeterGB::CMeterGB() { // printf("\r\nCMeterGB()"); pMPBase = new CMPGB(); } CMeterGB::CMeterGB( METERPARA meter) { // printf("\r\nCMeterGB( METERPARA meter)"); pMPBase = new CMPGB(); memcpy(&m_meter,&meter,sizeof(METERPARA)); } CMeterGB::~CMeterGB() { } int CMeterGB::OnReadAllItems(int m_mask) { int i; // time_t m_time,m_time1; // time( &m_time ); if(m_mask & 0x01) { i = OnReadEnergy( ); #ifdef DBUG_PRO if( i == 0) { printf("\r\n采集电表%d电量数据 ---- OK!!!",m_meter.No); } else { printf("\r\n采集电表%d电量数据 ---- FALL!!!",m_meter.No); } #endif } if(m_mask & 0x02) { i = OnReadPVC(); #ifdef DBUG_PRO if( i == 0) { printf("\r\n采集电表%d瞬时量数据 ---- OK!!!",m_meter.No); } else { printf("\r\n采集电表%d瞬时量数据 ---- FALL!!!",m_meter.No); } #endif } if(m_mask & 0x04) { i = OnReadMD( ); #ifdef DBUG_PRO if( i == 0) { printf("\r\n采集电表%d需量数据 ---- OK!!!",m_meter.No); } else { printf("\r\n采集电表%d需量数据 ---- FALL!!!",m_meter.No); } #endif } if(m_mask & 0x08 == 0x08) { i = OnReadEvent(); #ifdef DBUG_PRO if( i == 0) { printf("\r\n采集电表%d电表事件数据 ---- OK!!!",m_meter.No); } else { printf("\r\n采集电表%d电表事件数据 ---- FALL!!!",i); } #endif } // printf("\r\nmask:%02x",m_mask); if((m_mask & 0x10) == 0x10) { i = OnReadOther(); #ifdef DBUG_PRO if( i == 0) { printf("\r\n采集电表%d其他数据 ---- OK!!!",m_meter.No); } else { printf("\r\n采集电表%d其他数据 ---- FALL!!!",m_meter.No); } #endif } // printf("\r\n USED TIME %d",m_time1 - m_time); return 0; } int CMeterGB::OnReadEnergy( ) { int err = 0; int Item[ 6 ] = {0x901F,0x902F,0x913F,0x914F,0x915F,0x916F}; for(int i = 0; i < 6 ;i++) { err <<= 1; if(!ReadItem( Item[i], RETRYNUM)) { err |= 0x01; } } return err; } int CMeterGB::OnReadPVC() { int err = 0; int Item[ ] = { 0xB611,0xB612,0xB613,0xB621,0xB622, 0xB623,0xB630,0xB631,0xB632,0xB633, 0xB623,0xB640,0xB641,0xB642,0xB643, 0xB650,0xB651,0xB652,0xB653,0 }; for(int i = 0; Item[i]; i++) { err <<= 1; if(!ReadItem( Item[i], RETRYNUM)) { err |= 0x01; } } return err; } int CMeterGB::OnReadMD( ) { int err = 0; int Item[ 4 ] = {0xA01F,0xA02F,0xB01F,0xB02F}; for(int i = 0; i < 4; i++) { err <<= 1; if(!ReadItem( Item[i], RETRYNUM)) { err |= 0x01; } } return err; } int CMeterGB::OnReadEvent() { int err = 0; int Item[ 6 ] = {0xB210,0xB211,0xB212,0xB213,0xB31F,0xB32F}; for(int i = 0; i < 6; i++) { err <<=1; if(!ReadItem( Item[i], RETRYNUM)) { err |= 0x01; } } return err; } int CMeterGB::OnReadOther() { int err = 0; int Item[ 5 ] = {0xC010,0xC011,0xC030,0xC031,0xC33F};//Ok for(int i = 0; i < 5; i++) { err <<=1; if(!ReadItem( Item[i], RETRYNUM)) { err |= 0x01; } } return err; } bool CMeterGB::ReadItem(int Item, int RetryCount) { int FrmLen,RecvLen; BYTE tmp_buf[256]; FrmLen = pMPBase->FormReadDataFrame(OutFram, Item, m_meter.com_para.addr); if(FrmLen == 0) { #ifdef DBUG_PRO printf("\r\n组织命令数据失败!!!!"); #endif return false; } int j = 0xFFFF,i; for(i = 0; i < RetryCount; i ++) { if( !OnOpenCom() ) { continue;//串行口打开失败 } Write(OutFram,FrmLen); //发送帧 if ( !WaitForReponse(TIME_SEC) ) //等待回应帧 { OnCloseCom(); continue; } RecvLen = Read(tmp_buf,sizeof(tmp_buf) ); //读取帧 OnCloseCom(); DataLen = 0; j = pMPBase->ProcReturnedFrame(tmp_buf,RecvLen,Item,DataFrame,DataLen,m_meter.com_para.addr); if ( j == 0)//解析帧 { if(DataLen > 0) { // if(Item == 0xb611) // { // printf("\r\nSAVE DATA%02x%02x %d",DataFrame[0],DataFrame[1],m_meter.No); // } pShmMan->SaveDataToShm(DataFrame, m_meter.No, Item,0,DataLen); //GetShmData(BYTE * data, int posNum, int item, int & dataLen) // pShmMan->GetShmData(DataFrame, m_meter.No, Item,DataLen); // if(Item == 0xb611) // { // printf("\r\nREAD DATA%02x%02x %d\r\n",DataFrame[0],DataFrame[1],m_meter.No); // } } else pShmMan->SaveDataToShm(DataFrame, m_meter.No, Item,1,DataLen); return true; } if(j == 0x0600) { pShmMan->SaveDataToShm(DataFrame, m_meter.No, Item,2,DataLen); return true; } } if( i >= RetryCount && j == 0xFFFF) { pShmMan->SaveDataToShm(DataFrame, m_meter.No, Item,2,DataLen); } return false; }